package com.alice.core.context;

import com.alice.core.config.Rule;
import io.netty.channel.ChannelHandlerContext;

import java.util.Map;
import java.util.function.Consumer;

/**
 * 核心上下文接口定义
 */
public interface IContext {
    /**
     * 一个请求正在执行中的状态
     */
    int RUNNING = 0;

    /**
     * 标志请求结束，写回Response
     */
    int WRITTEN = 1;

    /**
     * 写回成功后，设置该标志，
     * 如果是Netty，ctx.WriteAndFlush(response)
     */
    int completed = 2;

    /**
     * 整个网关请求完毕，彻底结束
     */
    int terminated = -1;

    /**
     * 设置上下文状态为正常运行状态
     */
    void running();

    /**
     * 设置上下文状态为标记写回
     */
    void written();

    /**
     * 设置上下文状态为标记写回成功
     */
    void completed();

    /**
     * 请求完毕，彻底结束
     */
    void terminated();

    /**
     * 判断网关状态为运行状态
     * @return
     */
    boolean isRunning();
    boolean isWritten();
    boolean isCompleted();
    boolean isTerminated();

    /**
     * 获取请求转换协议
     * @return
     */
    String getProtocol();

    Rule getRule();

    Object getRequest();

    Object getResponse();

    Throwable getThrowable();

    /**
     * 上下文参数
     * @param key
     * @return
     */
    Object getAttribute(Map<String,Object> key);

    /**
     * 设置请求规则
     */
    void setRule();

    void setResponse();

    void setThrowable(Throwable throwable);

    void setAttribute(String key, Object obj);

    ChannelHandlerContext getNettyCtx();

    boolean isKeepAlive();

    void releaseRequest();

    void setCompletedCallBack(Consumer<IContext> consumer);

    void invokeCompletedCallBack(Consumer<IContext> consumer);

    


}
